iT邦幫忙

2024 iThome 鐵人賽

DAY 29
0
生成式 AI

LLM 應用、開發框架、RAG優化及評估方法 系列 第 29

Day29 AI爆炸時代 - Ollama 建置與內嵌python script設定

  • 分享至 

  • xImage
  •  

Ollama介紹

https://ithelp.ithome.com.tw/upload/images/20240830/20168537WtacCBkgAK.png
Ollama 是一款專為運行和管理各種機器學習模型而設計的工具。其核心功能是通過簡單的命令行操作或 REST API 來下載、部署和執行機器學習模型。Ollama 支持多種模型格式,例如 TensorFlow、PyTorch 等,並且可以在多種平台上運行,包括本地環境和 Docker 容器。

Ollama 的特點包括:

  1. 多模型支持:Ollama 支援多種機器學習模型格式,並且可以輕鬆切換和管理不同模型。

  2. 容器化支持:Ollama 可以在 Docker 容器中運行,這使得它非常適合在雲端或分佈式系統中部署。

  3. 簡化的使用介面:Ollama 提供了簡單直觀的命令行界面,允許用戶輕鬆下載、部署和測試模型。

  4. 高效的模型管理:Ollama 支援模型的版本控制和配置管理,方便用戶在不同環境中使用不同版本的模型。

  5. 集成能力:Ollama 可以與多種數據源和應用程式進行集成,從而實現端到端的機器學習應用程式部署。

安裝:

盡量用docker hub,去啟一個container來執行
一開始我用它預設snap的執行去ollama run 模型名稱
會遇到很多model都不能執行(因為ollama版本問題)
所以還是去用docker pull 抓最新的image比較好

image

必須是0.1.47以上,但我用snap只有0.1.31
LLM就都不回我訊息
解法就是用docker hub抓最新的去啟container啦

docker pull ollama/ollama:latest

這邊只是在你的本地創建了一個靜態的映像文件,並不會直接運行它。必須透過docker run 才是真正啟動一個基於image的container

docker images

image

啟動server

將下載好的image啟動為一個正在運行的container

 docker run -d --name ollama_service ollama/ollama:latest serve
  1. docker run
    這個命令才是真正啟動一個基於映像的容器。docker run 是將下載好的映像啟動為一個正在運行的容器,這個容器會成為應用程式運行的實際環境。

  2. -d
    這個標誌表示 Docker 會將容器作為一個守護進程在後台運行。這樣,容器不會佔用你的終端窗口,你可以在容器後台運行時繼續操作其他命令。如果你不加 -d,容器將會在前台運行,並且你的終端會被占用。

  3. --name ollama_service
    這個標誌用來指定你運行的容器的名稱。在這個例子中,容器的名稱被指定為 ollama_service。這使得你可以方便地通過這個名稱來管理容器,例如停止、啟動或刪除它。

  4. ollama/ollama:latest
    這是指定要使用的映像及其標籤。latest 是一個標籤,代表最新的版本。

  5. serve
    這個部分是告訴容器在啟動後要執行的命令。在這個例子中,serve 命令指示容器啟動 Ollama 的服務模式,讓它開始提供服務(例如 API 服務,或者是其他的網路服務)。

  • 總結:
  • docker pull 只是下載映像,並不會自動運行它。
  • docker run 才是啟動容器的命令,讓下載好的映像在一個隔離的環境中運行。
  • -d 讓容器在後台運行,--name 指定容器名稱,serve 指定容器啟動後要執行的具體操作。

因此,docker run -d --name ollama_service ollama/ollama:latest serve 這條命令的目的是在後台運行一個名為 ollama_service 的容器,這個容器基於 ollama/ollama:latest 映像,並且執行 serve 命令來啟動服務。

image

確保有container 在運行

docker ps

image

image

進入到該container中
docker exec -it ollama_service /bin/bash

image

即可安裝ollama 模型

ollama run gemma2

image

想要寫個script去記錄執行時間

  1. 在該container中建立一個資料夾,裡面將dockerfile和要執行的.py放在一起,然後用vi或nano去建立檔案
mkdir /app

image

  • vi安裝
apt-get update

apt-get install -y vim

vi 安裝好後,就可以開始寫啦!!
image

Dockerfile

FROM python:3.9-slim

RUN apt-get update && apt-get install -y curl

COPY ollama_response_time.py /app/ollama_response_time.py

WORKDIR /app

CMD ["python", "ollama_response_time.py"]

ollama_response_time.py

import time
import subprocess

def run_ollama_command(command, user_input):
    full_command = f'echo "{user_input}" | {command}'
    start_time = time.time()
    process = subprocess.Popen(full_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    end_time = time.time()
    
    response_time = end_time - start_time
    return stdout.decode('utf-8'), response_time

def download_model(model_name):
    print(f"Checking if the model '{model_name}' is already downloaded...")
    download_command = f"ollama pull {model_name}"
    process = subprocess.Popen(download_command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = process.communicate()
    
    if process.returncode == 0:
        print(f"Model '{model_name}' has been successfully downloaded.")
    else:
        print(f"Failed to download the model '{model_name}'. Error: {stderr.decode('utf-8')}")
        exit(1)

if __name__ == "__main__":
    model_name = input("請輸入模型名稱: ")
    
    # Step 1: Download the model if not already downloaded
    download_model(model_name)
    
    # Step 2: Prepare the command for running the model
    command = f"ollama run {model_name}"
    
    # Step 3: Begin the Q&A loop
    while True:
        user_input = input(">>> ")
        if user_input.lower() in ["exit", "/bye"]:
            break
        response, response_time = run_ollama_command(command, user_input)
        print(f"Response:\n{response}")
        print(f"Response Time: {response_time:.4f} seconds")

執行前,記得裝一下python3

apt-get install -y python3

就可以開始執行問答和紀錄時間了!

python3 /app/ollama_response_time.py

image

將container資訊寫成image

因為剛剛都是在container中執行,若關掉後,裡面的資訊也將會不見,所以我們把它包成image後,就可以不用每次都要重複這些步驟

  1. 先將模型刪掉,避免image太大包,而包不起來
    eg. image

  2. 在container中檢視一下現有的Model: ollama list
    image

  3. 先刪掉所有模型: ollama rm 模型名稱
    image

  4. 此時,再開一個終端機到host頁面 (切記!! 不可以離開原本的container中,不然資料會不見)

  5. 將container寫成image

docker commit d373235cc633 ollama_respond_time

image

image

  1. 啟動ollama server

但原本那個container 已經占用,所以現在就可以把那個container砍掉了
image

  1. 砍完container後,再啟一次ollama server
docker run -d --name ollama_service ollama_respond_time serve

image

image

  1. 進入到該container中
docker exec -it ollama_service /bin/bash

image

  1. 執行python3 run 就可以啦
python3 /app/ollama_response_time.py

image

image

以後步驟

  1. 進到VM中 sudo su
  2. 執行該container docker exec -it ollama_service /bin/bash
  3. 執行script python3 /app/ollama_response_time.py
  4. 輸入模型名稱即可 (名稱必須參照ollama run指令後面的 模型名字 全名才可以)

image

以上就是ollama的介紹啦,
終於要進入最後一天!
將會介紹一下Anything LLM與我的完賽感言XD


上一篇
Day28 GAI爆炸時代 - 聯發科 達哥& SUPERIOR API 平台
下一篇
Day30 GAI爆炸時代 - Anything LLM & 完賽感言
系列文
LLM 應用、開發框架、RAG優化及評估方法 30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言